package Java实验.实验二.小学学生信息管理系统第二版;

import java.io.Serializable;
import java.util.Calendar;

/**
 *@ClassName Student
 *@Description  本项目基于对第一版进行学生信息存于文件的操作
 *@Author 李明忠
 *@Date 2024/11/20 12:43
 *@Version 2.0
 */
public class Student implements Serializable {

/*------------------------1.成员变量---------------------------*/
    // 1.成员变量
    //扩充1：增加访问权限
    public String num;//学号（主键）可 设置为public以对外提供访问权限
    public String name;//姓名  设置为public以对外提供访问权限
    private String gender;//性别
    public int age;//年龄
    private String birthday;//生日
    public String myClass;//班级 设置为public以对外提供访问权限
    public String city;//籍贯
    private double mathScore;//数学成绩
    private double chineseScore;//语文成绩
    private double TotalScore;//总分成绩(语文+数学)
    //增添
    private double height;//身高(单位：m)
    private double weight;//体重(单位：kg)
    private String BMI;//身体质量质数(weight/height*height)
/*-----------------------------END-----------------------------------*/

/*-----------------------------2.构造函数----------------------------------*/
    // 2.构造函数
    public Student() {//无参构造

    }

    /**
     * @description: 有参构造是对最基本的学生信息初始化
     * @param: num name city
     * @return:无
     * @author mingzhong
     * @date: 23:22
     */
    public Student(String num, String name, String city) {
        this.num = num;
        this.name = name;
        this.city = city;
    }

    /**
     * @description: 除了成绩的信息位对其余基本学生信息初始化
     * 注意：
     * this.age = getAge();年龄通过计算得到(此时必须把 this.birthday = birthday写在前面)
     * 否则当运行到getAge()之时由于birthday值为null在getAge()函数中birthday.length()出
     * 现空指针异常
     * @param: null
     * @return:无
     * @author mingzhong
     * @date: 23:18
     */
    public Student(String num, String name, String gender, String birthday, String myClass, String city) {
        this.num = num;
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;//在年龄之前初始化
        this.age = getAge();//年龄通过计算得到(此时必须把 this.birthday = birthday写在前面)
        this.myClass = myClass;
        this.city = city;
        //增添
        this.height=getHeight();//初始化身高
        this.weight=getWeight();//初始化体重
        this.BMI=getBMI();//初始化BMI(BMI基于height和weight所以必须写在后面)
    }
/*-----------------------------END-----------------------------------*/

/*------------------------3.成员方法（函数）---------------------------*/
    // 3.成员方法（函数）
    //使用 /** 这个键产生方法的文档注释

    /**
     * @description: 获取年龄
     * 使用时间Calendar类 粗略计算年龄
     * @param: null
     * @return: int
     */
    //扩充2:实现年龄的计算
    public int getAge() {
        // 从字符串出生日期的年份去求age(粗略计算)
        Calendar ac=Calendar.getInstance();//以程序运行到该句时的日期
        int year=ac.get(Calendar.YEAR);//获取当前日期的年
        String s="";//存放年
        for (int i = 0; i < birthday.length(); i++) {
            char c=birthday.charAt(i);
            if(c >= '0'&&c <= '9'){
                s+=c;
            }else{
                break;
            }
        }
        int num=Integer.parseInt(s);//String转换为int
        return year-num;
    }

    /**
     * @description: 显示学生信息
     * @return: void
     */
    public void showInfo() {
        System.out.println("-------学生信息-------");
        System.out.println("学号：" + num);
        System.out.println("姓名：" + name);
        System.out.println("性别：" + gender);
        System.out.println("年龄：" + age);
        System.out.println("籍贯：" + city);
        System.out.println("班级：" + myClass);
        System.out.println("出生日期：" + birthday);
        System.out.println("语文成绩：" + getChineseScore());
        System.out.println("数学成绩：" + getMathScore());
        System.out.println("总分成绩(语文+数学)：" + getTotalScore());
        //增添
        System.out.printf("身高：%.2fm\n",getHeight());//用格式化输出使打印的身高控制为两位小数
        System.out.println("体重：" + getWeight()+"kg");
        System.out.println("BMI指数：" + getBMI());
    }

    /**
     * @description: 仅显示学生身体质量情况
     * @param: null
     * @return: void
     */
    public void displayStuPhyInfo(){
        System.out.println("-------学生身体质量信息-------");
        System.out.println("学号：" + num);
        System.out.println("姓名：" + name);
        System.out.printf("身高：%.2fm\n",getHeight());//用格式化输出使打印的身高控制为两位小数
        System.out.println("体重：" + getWeight()+"kg");
        System.out.println("BMI指数：" + getBMI());
    }

/*-----------------------------END-----------------------------------*/


/*------------------------4.setter和getter---------------------------*/
    /**
     * chineseScore  mathScore 这两个属性必须是参加考试后才有成绩因此
     * 使用get和set函数 而且私有的一般都是使用get和set函数
     */
    public double getChineseScore() {
        return chineseScore;
    }

    public void setChineseScore(double chineseScore) {
        this.chineseScore = chineseScore;
    }

    public double getMathScore() {
        return mathScore;
    }

    public void setMathScore(double mathScore) {
        this.mathScore = mathScore;
    }

    public double getTotalScore() {
        return TotalScore;
    }

    public void setTotalScore(double totalScore) {
        TotalScore = totalScore;
    }
    //身体质量的setter和getter

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String getBMI() {
        return BMI;
    }

    /**
     * @description: 求BMI指数、
     * 通过求bmi=weight/height*height借助条件分支语句
     * 对BMI进行赋值需要注意的是weight和height是当前调用者对象的属性
     * @param: void
     * @return: void
     */
    public void setBMI() {
        double bmi=this.weight/(this.height*this.height);
        if (bmi>=32) {
            this.BMI="非常肥胖";
        }else if (bmi>=28) {
            this.BMI="肥胖";
        }else if (bmi>=24) {
            this.BMI="过重";
        } else if (bmi>=18.5) {
            this.BMI="正常";
        }else {
            this.BMI="过轻";
        }
    }

    /*-----------------------------END-----------------------------------*/
}
